 package com.ruoyi.core.config.mp;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
import com.google.common.collect.Lists;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.core.config.handler.*;
import com.ruoyi.core.constant.WxConfigType;
import com.ruoyi.core.domain.vo.ConfigVo;
import com.ruoyi.core.service.IConfigService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
import me.chanjar.weixin.common.redis.JedisWxRedisOps;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.stream.Collectors;

import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE;
import static me.chanjar.weixin.common.api.WxConsts.EventType.UNSUBSCRIBE;
import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.*;
import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY;

 /**
  * @author <a href="https://github.com/binarywang">Binary Wang</a>
  */
 @Slf4j
 @Configuration
 @RequiredArgsConstructor (onConstructor_ = @Autowired )
 public class WxMpConfiguration {

//     private final IConfigService iConfigService;
//
//     private final LogHandler logHandler;
//     private final NullHandler nullHandler;
//     private final KfSessionHandler kfSessionHandler;
//     private final StoreCheckNotifyHandler storeCheckNotifyHandler;
//     private final LocationHandler locationHandler;
//     private final MenuHandler menuHandler;
//     private final MsgHandler msgHandler;
//     private final UnsubscribeHandler unsubscribeHandler;
//     private final SubscribeHandler subscribeHandler;
//     private final ScanHandler scanHandler;

     @Bean
     public static WxMpService wxMpService() {
         log.info("加载微信公众号配置类");
         // 代码里 getConfigs()处报错的同学，请注意仔细阅读项目说明，你的IDE需要引入lombok插件！！！！
         List<ConfigVo> configs = SpringUtils.getBean(IConfigService.class) .listWxConfig(WxConfigType.mp);
         if (configs == null || configs.size() == 0) {
             log.error("未找到微信配置类");
            return new WxMpServiceImpl();
//             throw new GlobalException("未找到微信配置类");
             //throw new RuntimeException("大哥，拜托先看下项目首页的说明（readme文件），添加下相关配置，注意别配错了！");
         }

         WxMpService service = new WxMpServiceImpl();
         service.setMultiConfigStorages(configs
             .stream().map(a -> {
                 WxMpDefaultConfigImpl configStorage;
                 configStorage = new WxMpDefaultConfigImpl();
                 log.info("信公众号名字：{}",a.getAppName());
                 configStorage.setAppId(a.getAppid());
                 configStorage.setSecret(a.getSecret());
                 configStorage.setToken(a.getToken());
                 configStorage.setAesKey(a.getAeskey());
                 return configStorage;
             }).collect(Collectors.toMap(WxMpDefaultConfigImpl::getAppId, a -> a, (o, n) -> o)));
         service.setMaxRetryTimes(3);
         return service;
     }

//     @Bean
//     public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
//         final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);
//
//         // 记录所有事件的日志 （异步执行）
//         newRouter.rule().handler(this.logHandler).next();
//
//         // 接收客服会话管理事件
//         newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION)
//             .handler(this.kfSessionHandler).end();
//         newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION)
//             .handler(this.kfSessionHandler).end();
//         newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION)
//             .handler(this.kfSessionHandler).end();
//
//         // 门店审核事件
//         newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(this.storeCheckNotifyHandler).end();
//
//         // 自定义菜单事件
//         newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.CLICK).handler(this.menuHandler).end();
//
//         // 点击菜单连接事件
//         newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.VIEW).handler(this.nullHandler).end();
//
//         // 关注事件
//         newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();
//
//         // 取消关注事件
//         newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end();
//
//         // 上报地理位置事件
//         newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.LOCATION).handler(this.locationHandler).end();
//
//         // 接收地理位置消息
//         newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(this.locationHandler).end();
//
//         // 扫码事件
//         newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.SCAN).handler(this.scanHandler).end();
//
//         // 默认
//         newRouter.rule().async(false).handler(this.msgHandler).end();
//
//         return newRouter;
//     }

 }
